package eightDataType.mStr;

import org.junit.Test;

import java.io.UnsupportedEncodingException;

/**
 * @author Ajie
 * @date 2021/9/18
 * @function
 */
public class StringLengthDemmo {
    public static void main(String[] args) {

        //    public int length() {
        //        return value.length;
        //    }
        //  private final char value[];
        String str = "😄";
        System.out.println("😄:"+str.length());//2

        String str你 = "你";
        System.out.println(str你+":"+str你.length());//1

        //龠 龡 龢 龣 龤 龥
//        String str4 = "龥";
        String str4 = "繁";
        System.out.println(str4+":"+str4.length());//1

    }

    //一个字符的String.length()是多少?
    //https://juejin.cn/post/6844904036873814023
    /**
     * String.length() //长度等于字符串中Unicode代码单元的数量。
     * Returns the length of this string. The length is equal to the number of Unicode code units in the string.
     * Returns:
     * the length of the sequence of characters represented by this object.
     *
     * Java中 有内码和外码这一区分简单来说
     * 内码：char或String在内存里使用的编码方式。
     * 外码：除了内码都可以认为是“外码”。（包括class文件的编码）
     */
    @Test
    public void mathStrLength() throws UnsupportedEncodingException {
        System.out.println("mathStrLength:");
        int zi = new String("字").getBytes().length;
        //“字”在 GBK 编码下占 2 字节，
        // 在 UTF-16 编码下也占 2 字节，
        // 在 UTF-8 编码下占 3 字节，
        // 在 UTF-32 编码下占 4 字节。
        //
        // “字”在 UTF-8 编码下占3字节，而“A”在 UTF-8 编码下占 1 字节。（因为 UTF-8 是变长编码）
        // 而 Java 中的 char 本质上是 UTF-16 编码。而 UTF-16 实际上也是一个变长编码（2 字节或 4字节）。
        System.out.println("StringLengthDemmo:mathStrLength:zi:"+zi);
        //getBytes 实际是做编码转换，你应该显式传入一个参数来指定编码，否则它会使用缺省编码来转换。
        //你说“ new String("字").getBytes().length 返回的是3 ”，这说明缺省编码是 UTF-8. 如果你显式地传入一个参数，比如这样“ new String("字").getBytes("GBK").length ”，那么返回就是 2. 你可以在启动 JVM 时设置一个缺省编码


        System.out.println("StringLengthDemmo:mathStrLength:zi:::"+new String("字").getBytes("GBK").length);//2
        System.out.println("StringLengthDemmo:mathStrLength:zi utf-16:::"+new String("字").getBytes("UTF-16").length);//4
        System.out.println("StringLengthDemmo:mathStrLength:zi utf-8:::"+new String("字").getBytes("UTF-8").length);//3

        String org = "😄";// 2
        System.out.println("StringLengthMaxTest:mathStrLength:"+org.length());
        System.out.println("StringLengthDemmo:mathStrLength:count:"+ org.codePointCount(0,org.length()));
        String a = "a";
        System.out.println("StringLengthMaxTest:mathStrLength:"+a.length());
        String zh = "我";//1
        System.out.println("StringLengthMaxTest:mathStrLength:"+zh.length());

//龠 龡 龢 龣 龤 龥
        String str4 = "龠龡龢龣龤龥";//6,每个都是1
//        String str4 = "龠";//1
//        String str4 = "龣";//1
//        String str4 = "龥";//1
//        String str4 = "繁";//1
        System.out.println(str4+":"+str4.length());//1

    }
}
